<?php
  /** Classe de fonctionnalité permetant de gerer les utilisateurs Balloon
   * Auteur : Sebastian Mosser
   */

class fManageUsers extends aFeature {

   public function __construct() {
      $this->_acl = new AccessControlList();
      $this->_acl->setGranted(7);
   }

   public static function getTocEntry() {
      return "Gestion Utilisateurs";
   }

	public static function getRealName() {
		return "Gestion des utilisateurs du système Balloon";
	}
	
	public static function getSemantic() {
		$res  = "Cette fonctionnalité permet d'ajouter, éditer ou supprimer des utilisateurs.";
		return $res;
	}
   

   protected function run() {
   	$page = $this->header();
   	try {
	   	$page .= $this->process();
	   }
	   catch (Exception $e) {
	   	$page .= "<h2>Une erreur est survenue !</h2>";
	   	$page .= "<p> <span class=\"error\">".$e->getMessage()."</span></p>";
	   	//$page .= "<p> <span class=\"error\">".$e."</span></p>";
	   }
   	return $page;
   }
   
	private function process() {
	
		$mode = PropRetriever::getProp($_POST,"mode");
		$action = PropRetriever::getProp($_POST,"action");
		$actionGet = PropRetriever::getProp($_GET,"doAction");
		
		// Les paramètres d'URL outrepassent les paramètres POST
		if ($actionGet != "")
			$action = $actionGet;
	
		if ($mode != "")
			$ans = $this->doMode($mode);
		else if ($action != "")
			$ans = $this->doAction($action);
		else
		   $ans = $this->doMode("list"); // action par défaut
		return $ans;	
	}
   
	private function doMode($mode) {
		if ($mode == "add") {
			//throw new Exception("L'action ADD n'existe pas  encore !");
			return $this->addForm();
		}
		else if ($mode == "edit")
		{
			return $this->editSearch();
		}
		else if ($mode == "list") {
		   return $this->printList();
		}
		else {
			throw new Exception("L'action demandée n'existe pas !");
		}
	}   
   
   private function doAction($action) {
      if ($action == "addUser")
         return $this->addUser();
      else if ($action == "editUser")
      	 return $this->editUser(PropRetriever::getProp($_GET,"userId"));
      else if ($action == "doEdit")
      	 return $this->doModification();
      else {
			throw new Exception("L'action demandée n'existe pas !");
		}
   
   }
   
   
   private function doModification() {
     if (PropRetriever::getProp($_POST,"del") != "")
     	return $this->delUser();
     else if (PropRetriever::getProp($_POST,"valid") != "")
     	return $this->editSomeone();
     else
     	throw new Exception("Requete incohérente !!");
   }
 
	private function editSearch() {
      $page = "<h2>Etape 1 : Choix de l'utilisateur a modifier</h2>\n";
      $page .= "<p>Pour choisir l'utilisateur que vous voulez modifier, il suffit de cliquer sur son nom de login.</p>";
      $page .= User::showResult(User::lookFor("%"),"?doAction=editUser&");
      return $page;
   }

	private function delUser() {
		$page = "<h2>Suppression d'un utilisateur </h2>";
		$page .= "<p>L'utilisateur suivant a été définitivement supprimé du système Balloon.</p>";
		$user2delete = User::read(PropRetriever::getProp($_POST,"userId"));
		$intels = $user2delete->displayLong();
		$user2delete->delete();
		return $page.$intels;
	}

	private function editSomeone() {
		
		// On récupère ce qu'a saisi l'utilisateur
		$newLogin = PropRetriever::getProp($_POST,"login");
		$newPasswd = PropRetriever::getProp($_POST,"passwd");
		$newGroups = PropRetriever::getArray($_POST,"groups");
		
		$user2edit = User::read(PropRetriever::getProp($_POST,"userId"));
		
		// On vérifie la validité, en tenant compte que ce nom de login est potentiellement déjà pris
		$errors = User::isValid($newLogin,$newPasswd,$newGroups, $user2edit->getLogin());
		
		if (! empty($errors))
			return $this->editUser($user2edit->getId(),$errors);
			
		$user2edit->setLogin($newLogin);
		if ($newPasswd != "")
			$user2edit->setPassword($newPasswd);
		
		// On dégage les anciens groupes et on mets les nouveaux :
		foreach ($user2edit->getGroups() as $k => $v)
			$user2edit->delFromGroup($k);
		$user2edit->update();
		
		foreach($newGroups as $k => $v)
			$user2edit->addInGroup($v);
		// C'est cheum, mais c'est pas comme si j'avais le temps en ce moment ;-)
		$user2edit->update();
		$user2edit = User::read($user2edit->getId());
		
		
		$page = "<h2>Modification d'un utilisateur </h2>";
		$page .= "<p> Les modifications ont été effectuées avec succès ! </p>";
		$page .= $user2edit->displayLong();
		
		return $page;
	}

   private function editUser($userId, $error = array()) {
   	 $aUser = User::read($userId);
   	 $page = "<h2>Etape 1 : Choix de l'utilisateur a modifier</h2>\n";
   	 $page .= "<p>Vous avez choisi de modifier l'utilisateur <code>[".$aUser->getLogin()."]</code></p>";
   	 $page .=<<<EOS
   	 <p> <center>
   	 <form class="button" method="post">
	   <input type="hidden" name="mode" value="edit" action="?edit"/>
	   <input class="button" type="submit" name="button" value="Changer d'utilisateur" />
     </form>
     </center></p>
     
EOS;
   	 $page .= "<h2>Etape 2 : Modification de l'utilisateur </h2>";
   	 
   	 // Récupération de l'utilisateur tel qu'il est dans le système
   	 $existantLogin = $aUser->getLogin();  	 
   	 $tmp = $aUser->getGroups();
   	 // On flippe les groups pour rester cohérent avec ce qu'on attend dans l'IHM.
   	 $existantsGroups = array();
   	 foreach ($tmp as $k => $v)
   	 	$existantsGroups[] = $k;
   	 
   	 // Récupération de ce qu'a saisi l'utrilisateur dans l'IHM.
   	 $postedLogin  = PropRetriever::getProp($_POST,"login");
   	 $postedGroups = PropRetriever::getArray($_POST,"groups");
   	 $existantPasswd = PropRetriever::getProp($_POST,"passwd");
   	 
   	 if (! empty ($postedGroups))
   	 	$existantsGroups = $postedGroups;
   	 if ($postedLogin != "")
   	 	$existantLogin = $postedLogin;
   	 
   	 $availablesGroups = self::getGroupsForSelect($existantsGroups);
   	 
   	 $labelStyle = array();
      $labelStyle["login"] = (PropRetriever::getProp($error,"login") == "" ? 
      							"" : "class=\"error\"");
      $labelStyle["passwd"] = (PropRetriever::getProp($error,"passwd") == "" ? 
      							"" : "class=\"error\"");
      $labelStyle["groups"] = (PropRetriever::getProp($error,"groups") == "" ?
      							"" : "class=\"error\"");

	  $userErrors = "";
	  if (! empty($error)) {
      	$userErrors = "<p><b>Erreurs survenue lors du traitement du formulaire : </b><ul>\n";
      	foreach($error as $e)
      		$userErrors .= "  <li><span class=\"error\">${e}</span></li>\n";
      	$userErrors .= "</ul></p>\n";
	  }
   	 
   	 $myForm = <<<EOS
   <p>Effectuez les modifications adéquates puis cliquez sur <code>Valider</code>.</p>
   <p><strong>Remarque</strong> : Remplisser le champ <span class="error">[ Mot de Passe ]</span> 
   uniquement pour remplacer le mot de passe de l'utilisateur par un nouveau mot de passe.</p>
   
   <div align="center">    
    <form method="post" accept-charset="utf-8" action="${_SERVER['PHP_SELF']}">
    <fieldset>
      <legend>Modification d'un utilisateur</legend>
      <br />
      <label>
        <span ${labelStyle["login"]} > Nom de login : </span>
        <input type="text" name="login" class="edit" value="${existantLogin}" /> &nbsp; &nbsp;
      </label>
      <br />
      <label>
        <span ${labelStyle["passwd"]} >Mot de passe : </span>
        <input type="password" name="passwd" class="edit" value="${existantPasswd}" /> &nbsp; &nbsp;
      </label>
      <br />
      <label>
        <span ${labelStyle["groups"]} >Groupes : </span>
        $availablesGroups &nbsp; &nbsp;
      </label>
      <br />
      <input type="hidden" name="action" value="doEdit" />
      <input type="hidden" name="userId" value="${userId}" />
      <input type="submit" name="valid"  value="Valider" class="button" />
            &nbsp; &nbsp; 
      <input type="submit" name="del"    value="Supprimer" class="button" 
              onClick="return window.confirm('Veuillez confirmer la suppression ...')"/>
    </fieldset>
    </form>
   </div>
   <br />
   ${userErrors}
EOS;

	$page .= $myForm;
     return $page;
   }
 
   private function addUser() {
   	// Recupération des infos du formulaire
   	$login  = PropRetriever::getProp($_POST,"login");
   	$passwd = PropRetriever::getProp($_POST,"passwd");
   	$groups = PropRetriever::getArray($_POST,"groups");
   	
   	// Verification d'erreur ...
   	$error = User::isValid($login,$passwd,$groups); 	
   	
   	if (! empty($error))
   		return $this->addForm($error);
   	
   	// On créé le nouvel utilisateur : 
   	$newUser = new User($login);
   	$newUser->setPassword($passwd);
   	foreach ($groups as $k => $v)
   		$newUser->addInGroup($v);
   	// On ajoute l'utilisateur dans le système de base :
   	$newUser->create();
   	
   	// On affiche le nouvel utilisateur :
   	$result = "<h2>Ajout effectué avec succès !</h2>\n";
   	$result .= $newUser->displayLong();
   	return $result;
   }
   
   private function printList() {
      $page = "<h2>Listing des utilisateurs du système </h2>\n";
      $page .= "<p>Vous trouvez ci-dessous la liste de tous les utilisateurs ayant un compte sur le portail.</p>";
      $page .= User::showResult(User::lookFor("%"));
      return $page;
   }
   
   
   
   private static function getGroupsForSelect($selectedGroups) {
    $ans = Group::lookFor("%");
   	$groups = "";    
    while(($row = Database::assoc($ans)) != False) {
    	if (in_array($row["id"],$selectedGroups))
      		$selected = "selected";
      	else 
      		$selected = "";
        $groups .= "  <option value=\"".$row["id"]."\" ${selected} > ".$row["label"]."</option>\n";
      }
	  $availablesGroups = "<select name=\"groups[]\" class=\"edit\" multiple> \n".$groups."</select>\n";
   	  return $availablesGroups;   
   }
   
   private function addForm($error = "") {
   	  $existantLogin  = PropRetriever::getProp($_POST,"login");
   	  $existantPasswd = PropRetriever::getProp($_POST,"passwd");
   	  $existantGroups = PropRetriever::getArray($_POST,"groups");
	  $availablesGroups = self::getGroupsForSelect($existantGroups);
      
      $labelStyle = array();
      $labelStyle["login"] = (PropRetriever::getProp($error,"login") == "" ? 
      							"" : "class=\"error\"");
      $labelStyle["passwd"] = (PropRetriever::getProp($error,"passwd") == "" ? 
      							"" : "class=\"error\"");
      $labelStyle["groups"] = (PropRetriever::getProp($error,"groups") == "" ?
      							"" : "class=\"error\"");

	  $userErrors = "";
	  if (! empty($error)) {
      	$userErrors = "<p><b>Erreurs survenue lors du traitement du formulaire : </b><ul>\n";
      	foreach($error as $e)
      		$userErrors .= "  <li><span class=\"error\">${e}</span></li>\n";
      	$userErrors .= "</ul></p>\n";
	  }

      $myForm = <<<EOS
  <h2>Ajout d'un utilisateur dans le système Balloon</h2>
   <p>Veuillez entrer les informations suivantes pour ajouter un utilisateur dans le système.</p>
   <div align="center">    
    <form method="post" accept-charset="utf-8">
    <fieldset>
      <legend>Nouvel Utilisateur</legend>
      <br />
      <label>
        <span ${labelStyle["login"]} > Nom de login : </span>
        <input type="text" name="login" class="edit" value="${existantLogin}" /> &nbsp; &nbsp;
      </label>
      <br />
      <label>
        <span ${labelStyle["passwd"]} >Mot de passe : </span>
        <input type="password" name="passwd" class="edit" value="${existantPasswd}" /> &nbsp; &nbsp;
      </label>
      <br />
      <label>
        <span ${labelStyle["groups"]} >Groupes : </span>
        $availablesGroups &nbsp; &nbsp;
      </label>
      <br />
      <input type="hidden" name="action"     value="addUser" />
      <input type="submit" value="Ajouter dans le système" class="button" />
    </fieldset>

    </form>
   </div>
   <br />
   ${userErrors}
   <p> <b>Remarque : </b> Lorsque vous ajoutez un utilisateur dans le système, vous lui ouvrez un compte sur le portail.
    Il ne possède par contre pas de compte sur le réseau intranet du club.
    </p>
EOS;
	
      return $myForm;
   }
   
   private function header() {
   	$head = <<<EOS
 <h1> Service de gestion des utilisateurs </h1>
<center>
<form class="button" method="post" action="?list">
	<input type="hidden" name="mode" value="list" />
	<input class="button" type="submit" name="button" value="Lister les utilisateurs" />
</form>
&nbsp;&nbsp;
<form class="button" method="post" action="?add">
	<input type="hidden" name="mode" value="add" />
	<input class="button" type="submit" name="button" value="Ajouter un utilisateur" />
</form>
&nbsp;&nbsp;
<form class="button" method="post" action="?edit">
	<input type="hidden" name="mode" value="edit" />
	<input class="button" type="submit" name="button" value="Modifier un utilisateur" />
</form>

</center>
<br/> <br/>
EOS;
   	return $head;
   }
   
   
   
}

?>